package com.glela.common.util;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

/**
 * 
 * @author houmf
 * @version 创建时间：2016年5月30日 下午5:23:03
 * @name Aes加密工具类
 */
public class AesUtil {

	private static String getKey() {
		// int days = Math.round(System.currentTimeMillis() / 1000 / 3600 / 24);
		// StringBuffer sb = new StringBuffer().append(DateUtil.getYear()).append("bububa").append(days).append((days % 2 == 0) ? 2 : 1);
		return "bububa0123456789";
	}
	
	

	/**
	 * 加密
	 * 
	 * @param sSrc 需要加密内容
	 * @return String 加密后内容
	 */
	public static String encrypt(String str) throws Exception {
		if (str == null) {
			return null;
		}
		byte[] raw = getKey().getBytes();
		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// "算法/模式/补码方式"
		IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());// 使用CBC模式，需要一个向量iv，可增加加密算法的强度
		cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
		byte[] encrypted = cipher.doFinal(str.getBytes());

		return new String(Base64.encodeBase64(encrypted));// 此处使用BASE64做转码功能，同时能起到2次加密的作用。
	}

	/**
	 * 解密
	 * 
	 * @param sSrc 需要解密内容
	 * @return String 解密后内容
	 */
	public static String decrypt(String str) throws Exception {
		// 判断是否传数据
		if (str == null || "".equals(str)) {
			return null;
		}
		byte[] raw = getKey().getBytes("UTF-8");
		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
		IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());
		cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
		byte[] encrypted = Base64.decodeBase64(str);// 先用base64解密
		byte[] original = cipher.doFinal(encrypted);
		String originalString = new String(original);
		return originalString;
	}
}
